package com.qf.sl.youshare.views;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.GridView;

/**
 * Created by IDEA
 * User : sl
 * on 2015/2/7.
 * 9:59
 */

/**
 * 继承GridView, 实现在 GridView 能完整显示的 GridView
 *  通常不推荐在 ScrollView 中放 GridView 和 ListView
 *  如果必须采用这种方式,那么久采用自定义的 GridView 或者
 *  ListView实现 确保高度
 *  但是 GridView 或者 ListView 的优化, 可能会失效
 */
public class FullGridView extends GridView {

    //1, 自定义View 知识点1: 构造方法, layout 布局的引用

    /**
     * 构造方法, 通常用于在代码中创建 View 控件时 使用
     *  这个方法只能够在代码中创建 View
     * @param context
     */
    public FullGridView(Context context){
        super(context);
    }

    /**
     * 如果一个自定义View, 需要放到 layout xml 文件中,
     *  那么必须提供这个构造方法
     * @param context
     * @param attrs
     */
    public FullGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FullGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    //对于在 ScrollView 中的 GridView
    // 我们需要重写一个方法, onMeasure(int, int) 方法


    /**
     * 本方法通常在,父容器Layout 计算尺寸的时候, 需要向子控件或者容器
     *  问一下子空控件的大小, 这个时候,子控件就要计算一下自己到底有多大
     *  然后返回给父容器\
     *  当子空间/子容器 计算自己有多大的时候,会进行一个回调方法
     *  这个回调方法, 就是 onMeasure(int, int) 方法
     *  这个方法内部必须要设置自身的尺寸
     *  这样父容器才知道有多大
     * @param widthMeasureSpec 宽度的尺寸规格,宽度包含父容器给控件的(父容器最大允许控件有多宽)
     * @param heightMeasureSpec 高度尺寸规格,高度包含父容器最大允许控件有多高 同时还是 wrap_content 还是 match_parent
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        //获取宽度规格中的宽度数值
        int wSize = MeasureSpec.getSize(widthMeasureSpec);
        int wMode = MeasureSpec.getMode(widthMeasureSpec);

        System.out.println("wSize = " + wSize);

        //获取 高度中的高度数值
        int hSize = MeasureSpec.getSize(heightMeasureSpec);
        int hMode = MeasureSpec.getMode(heightMeasureSpec);

        /*
            wSize, hSize 就是父容器给当前控件提供的最大空间
                         或者就是再Layout文件中, 我们制定的数值尺寸,
                         实际获取的数值
         */

        //mode 代表了, 尺寸的计算方式
        //MeasureSpec 里面提供了尺寸计算模式的方式

        switch (hMode){
            case MeasureSpec.AT_MOST://wrap_content
                System.out.println("1");
                break;
            case MeasureSpec.EXACTLY: //match_parent, xxxdp
                System.out.println("2");
                break;
            case MeasureSpec.UNSPECIFIED: // 未指定,不限定尺寸计算的方式
                System.out.println("3");
                break;
            default:
                break;
        }

        //如果我们能够把高度设置 hSize 设置一个很大的值, 并且将这个计算模式调整为
        //  AT_MOST(warp_content), 那么 GridView 将能够完美显示

        //重新生成一个 int 值, 这个值通过 MeasureSpec 将 size 和 mode
        //  组合,就可以放 GridView 了

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 1, MeasureSpec.AT_MOST);

        System.out.println("hMode = " + hMode);

        System.out.println("hSize = " + hSize);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}
